import Stack from '../data-structures/stack-object';

/**
 * 平衡圆括号（利用栈结构）
 * 思路：将字符串里的左括号存进栈结构里，遍历到右括号时与栈顶元素相匹配（栈为空或者匹配不成功就判为false）
 * @param symbols 目标字符串
 */
export function parenthesesChecker(symbols: string): boolean {
    const begin = '([{';
    const end = ')]}';
    let index: number = 0;
    const stack = new Stack<string>();
    let balance: boolean = true;

    while (index < symbols.length && balance) { // 遍历完或者找出不平衡
        const symbol = symbols[index];
        if (begin.indexOf(symbol) >= 0) {
            stack.push(symbol); // 如果是左括号就存入栈
        } else { // 当前符号是右括号
            if (stack.isEmpty()) { // 当前符号是右括号，但栈里没有左括号了，无法平衡
                balance = false;
            } else { // 当前符号是右括号，栈里还有左括号
                const top = stack.pop(); // 取出栈顶的左括号
                if (!(begin.indexOf(top) === end.indexOf(symbol))) { // 该右括号与栈顶的左括号对应不上，无法平衡
                    balance = false;
                }
            }
        }
        index ++;
    }
    return balance && stack.isEmpty();
}
